home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / RCP.jar / com / extensibility / util / Security.class (.txt)
Encoding:
Java Class File  |  2000-08-03  |  5.7 KB  |  298 lines

  1. package com.extensibility.util;
  2.  
  3. import java.util.Calendar;
  4. import java.util.GregorianCalendar;
  5. import java.util.Random;
  6.  
  7. public final class Security {
  8.    private static final int NO_ERROR = -1;
  9.    private long regCode;
  10.    private long errDigit = -1L;
  11.    private static final byte SCHEME_HASH_NAME_ORG = 7;
  12.    private static final byte SCHEME_ID_BASED = 8;
  13.    private static long[] SEED = new long[]{5866932300294644261L, 7024403726759890087L, 2748076388224288114L, -6132556317925417883L, -377129364045086088L, -7907032981491668086L, 1545863772813216586L, -2073066160489659954L, 214103949628198354L, 5343966063913332048L, -4762362384337982286L, -7998867701170400188L, 2496590497142445312L, -8588422786031584434L, -3310401677126329201L, 2156169837751358096L};
  14.    public static byte LAUNCH_LIMIT_MASK = 1;
  15.    public static byte BIZ_ONLY_MASK = 2;
  16.    public static byte EXCELLON_30DAY_MASK = 4;
  17.    private static Random random = new Random(System.currentTimeMillis());
  18.  
  19.    public static String generateRegCode7(byte var0, String var1, String var2, Calendar var3, int var4, byte var5) {
  20.       return createRegCode7(var0, var1, var2, var3, var4, var5).format();
  21.    }
  22.  
  23.    public static String generateRegCode8(byte[] var0, int var1, Calendar var2, int var3, byte var4) {
  24.       return createRegCode8(var0, var1, var2, var3, var4).format();
  25.    }
  26.  
  27.    public static Security createRegCode8(byte[] var0, int var1, Calendar var2, int var3, byte var4) {
  28.       long var5 = 0L;
  29.       var5 = setDigit(var5, (long)digit((long)var0[0], 0), 3);
  30.       var5 = setDigit(var5, (long)digit((long)var1, 3), 8);
  31.       var5 = setDigit(var5, (long)digit((long)var1, 2), 7);
  32.       var5 = setDigit(var5, (long)digit((long)var1, 1), 0);
  33.       var5 = setDigit(var5, (long)digit((long)var1, 0), 12);
  34.       int var7 = var2.get(1);
  35.       int var8 = var2.get(6);
  36.       int var9 = (var7 - 1999) * 365 + var8;
  37.       var5 = setDigit(var5, (long)digit((long)var9, 2), 10);
  38.       var5 = setDigit(var5, (long)digit((long)var9, 1), 13);
  39.       var5 = setDigit(var5, (long)digit((long)var9, 0), 1);
  40.       var5 = setDigit(var5, (long)digit((long)var3, 1), 9);
  41.       var5 = setDigit(var5, (long)digit((long)var3, 0), 2);
  42.       var5 = setDigit(var5, (long)digit((long)var4, 0), 4);
  43.       var5 = munge(var5);
  44.       var5 = setDigit(var5, 8L, 5);
  45.       var5 = checksum(var5);
  46.       return new Security(var5);
  47.    }
  48.  
  49.    public static Security createRegCode7(byte var0, String var1, String var2, Calendar var3, int var4, byte var5) {
  50.       long var6 = 0L;
  51.       var6 = setDigit(var6, (long)digit((long)var0, 0), 3);
  52.       int var8 = hash(var1) ^ hash(var2);
  53.       var6 = setDigit(var6, (long)digit((long)var8, 3), 8);
  54.       var6 = setDigit(var6, (long)digit((long)var8, 2), 7);
  55.       var6 = setDigit(var6, (long)digit((long)var8, 1), 0);
  56.       var6 = setDigit(var6, (long)digit((long)var8, 0), 12);
  57.       int var9 = var3.get(1);
  58.       int var10 = var3.get(6);
  59.       int var11 = (var9 - 1999) * 365 + var10;
  60.       var6 = setDigit(var6, (long)digit((long)var11, 2), 10);
  61.       var6 = setDigit(var6, (long)digit((long)var11, 1), 13);
  62.       var6 = setDigit(var6, (long)digit((long)var11, 0), 1);
  63.       var6 = setDigit(var6, (long)digit((long)var4, 1), 9);
  64.       var6 = setDigit(var6, (long)digit((long)var4, 0), 2);
  65.       var6 = setDigit(var6, (long)digit((long)var5, 0), 4);
  66.       var6 = munge(var6);
  67.       var6 = setDigit(var6, 7L, 5);
  68.       var6 = checksum(var6);
  69.       return new Security(var6);
  70.    }
  71.  
  72.    private static boolean isKnownScheme(int var0) {
  73.       return var0 == 7 || var0 == 8;
  74.    }
  75.  
  76.    private static long parseLong(String var0) throws NumberFormatException {
  77.       char var1 = var0.charAt(0);
  78.       long var2 = (long)Character.digit(var1, 16);
  79.       if (var2 > 7L) {
  80.          String var4 = var0.substring(1);
  81.          var2 -= 8L;
  82.          var1 = (new Long(var2)).toString().charAt(0);
  83.          String var5 = var1 + var0.substring(1);
  84.          long var6 = Long.parseLong(var5, 16);
  85.          var6 = Long.MIN_VALUE + var6;
  86.          if (!Long.toHexString(var6).equalsIgnoreCase(var0)) {
  87.             Debug.trace(Long.toHexString(var6) + " != " + var0);
  88.          }
  89.  
  90.          return var6;
  91.       } else {
  92.          return Long.parseLong(var0, 16);
  93.       }
  94.    }
  95.  
  96.    public static Security createRegCode(byte[] var0, String var1, String var2, String var3) {
  97.       byte var4 = -1;
  98.       var3 = StringUtilities.replace(var3, "-", "");
  99.  
  100.       try {
  101.          long var5 = parseLong(var3);
  102.          int var7 = digit(var5, 5);
  103.          if (!isKnownScheme(var7)) {
  104.             var4 = 5;
  105.          }
  106.  
  107.          long var8 = checksum(var5);
  108.          if (digit(var5, 6) != digit(var8, 6)) {
  109.             var4 = 6;
  110.          }
  111.  
  112.          if (digit(var5, 11) != digit(var8, 11)) {
  113.             var4 = 11;
  114.          }
  115.  
  116.          long var10 = unmunge(var5);
  117.          switch (var7) {
  118.             case 7:
  119.                int var12 = hash(var1) ^ hash(var2);
  120.                if (digit(var10, 8) != digit((long)var12, 3)) {
  121.                   var4 = 8;
  122.                }
  123.  
  124.                if (digit(var10, 7) != digit((long)var12, 2)) {
  125.                   var4 = 7;
  126.                }
  127.  
  128.                if (digit(var10, 0) != digit((long)var12, 1)) {
  129.                   var4 = 0;
  130.                }
  131.  
  132.                if (digit(var10, 12) != digit((long)var12, 0)) {
  133.                   var4 = 12;
  134.                }
  135.             case 8:
  136.             default:
  137.                boolean var16 = false;
  138.  
  139.                for(int var13 = 0; var13 < var0.length; ++var13) {
  140.                   if (digit(var10, 3) == digit((long)var0[var13], 0)) {
  141.                      var16 = true;
  142.                   }
  143.                }
  144.  
  145.                if (!var16) {
  146.                   var4 = 3;
  147.                }
  148.  
  149.                return new Security(munge(var10), var4);
  150.          }
  151.       } catch (RuntimeException var14) {
  152.          ((Throwable)var14).printStackTrace();
  153.          return new Security(0L, 0);
  154.       }
  155.    }
  156.  
  157.    public boolean isValid() {
  158.       return this.errDigit == -1L;
  159.    }
  160.  
  161.    private Security(long var1) {
  162.       this.regCode = var1;
  163.    }
  164.  
  165.    private Security(long var1, int var3) {
  166.       this.regCode = var1;
  167.       this.errDigit = (long)var3;
  168.    }
  169.  
  170.    private static String format(long var0) {
  171.       StringBuffer var2 = new StringBuffer(Long.toHexString(var0));
  172.       if (var2.length() < 16) {
  173.          var2.insert(0, (new String("0000000000000000")).substring(0, 16 - var2.length()));
  174.       }
  175.  
  176.       var2.insert(12, '-');
  177.       var2.insert(8, '-');
  178.       var2.insert(4, '-');
  179.       return var2.toString();
  180.    }
  181.  
  182.    public String format() {
  183.       StringBuffer var1 = new StringBuffer(Long.toHexString(this.regCode));
  184.       if (var1.length() < 16) {
  185.          var1.insert(0, (new String("0000000000000000")).substring(0, 16 - var1.length()));
  186.       }
  187.  
  188.       var1.insert(12, '-');
  189.       var1.insert(8, '-');
  190.       var1.insert(4, '-');
  191.       return var1.toString().toUpperCase();
  192.    }
  193.  
  194.    private long naked() {
  195.       return unmunge(this.regCode);
  196.    }
  197.  
  198.    public GregorianCalendar getExpirationDate() {
  199.       int var1 = digit(this.regCode, 9);
  200.       int var2 = digit(this.regCode, 2);
  201.       int var3 = digit(this.naked(), 9) * 16 + digit(this.naked(), 2);
  202.       if (var3 == 0) {
  203.          return null;
  204.       } else {
  205.          GregorianCalendar var4 = this.getGenDate();
  206.          var4.add(5, var3);
  207.          return var4;
  208.       }
  209.    }
  210.  
  211.    public boolean isExpired() {
  212.       int var1 = digit(this.naked(), 9) * 16 + digit(this.naked(), 2);
  213.       if (var1 == 0) {
  214.          return false;
  215.       } else {
  216.          GregorianCalendar var2 = this.getGenDate();
  217.          var2.add(5, var1);
  218.          return var2.before(new GregorianCalendar());
  219.       }
  220.    }
  221.  
  222.    public GregorianCalendar getGenDate() {
  223.       int var1 = digit(this.naked(), 10) * 256 + digit(this.naked(), 13) * 16 + digit(this.naked(), 1);
  224.       int var2 = 1999 + var1 / 365;
  225.       int var3 = var1 % 365;
  226.       return new GregorianCalendar(var2, 0, var3);
  227.    }
  228.  
  229.    public int getRestrictions() {
  230.       return digit(this.naked(), 4);
  231.    }
  232.  
  233.    public boolean isLaunchLimited() {
  234.       return (digit(this.naked(), 4) & LAUNCH_LIMIT_MASK) > 0;
  235.    }
  236.  
  237.    public boolean isBizTalkOnly() {
  238.       return (digit(this.naked(), 4) & BIZ_ONLY_MASK) > 0;
  239.    }
  240.  
  241.    public boolean isExcellon30Day() {
  242.       return (digit(this.naked(), 4) & EXCELLON_30DAY_MASK) > 0;
  243.    }
  244.  
  245.    private static long setDigit(long var0, long var2, int var4) {
  246.       var0 &= ~(15L << var4 * 4);
  247.       var0 |= var2 << var4 * 4;
  248.       return var0;
  249.    }
  250.  
  251.    private static int digit(long var0, int var2) {
  252.       return (int)((var0 & 15L << var2 * 4) >>> var2 * 4);
  253.    }
  254.  
  255.    private static int hash(String var0) {
  256.       int var1 = 0;
  257.       int var2 = 0;
  258.       int var3 = var0.length();
  259.       char[] var4 = var0.toCharArray();
  260.       if (var3 < 16) {
  261.          for(int var5 = var3; var5 > 0; --var5) {
  262.             var1 = var1 * 37 + var4[var2++];
  263.          }
  264.       } else {
  265.          int var7 = var3 / 8;
  266.  
  267.          for(int var6 = var3; var6 > 0; var2 += var7) {
  268.             var1 = var1 * 39 + var4[var2];
  269.             var6 -= var7;
  270.          }
  271.       }
  272.  
  273.       return var1;
  274.    }
  275.  
  276.    private static long munge(long var0) {
  277.       int var2 = Math.min(15, (int)(random.nextFloat() * 16.0F));
  278.       long var3 = var0 ^ SEED[var2];
  279.       var3 = setDigit(var3, (long)var2, 14);
  280.       return var3;
  281.    }
  282.  
  283.    private static long checksum(long var0) {
  284.       long var2 = setDigit(var0, 0L, 6);
  285.       var2 = setDigit(var2, 0L, 11);
  286.       long var4 = var2 / 13L;
  287.       var2 = setDigit(var2, (long)digit(var4, 1), 6);
  288.       var2 = setDigit(var2, (long)digit(var4, 0), 11);
  289.       return var2;
  290.    }
  291.  
  292.    private static long unmunge(long var0) {
  293.       int var2 = digit(var0, 14);
  294.       var0 = setDigit(var0, 0L, 14);
  295.       return var0 ^ SEED[var2];
  296.    }
  297. }
  298.